package de.fhffm.gaertnerei.gui;
/**
 * @author Riad Hassani & Kerim Septa
 */

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import de.fhffm.gaertnerei.exceptions.EingabeException;
import de.fhffm.gaertnerei.tabellen.Mitarbeiter;

@SuppressWarnings("serial")
public class NeuerMitarbeiterFenster extends JFrame implements ActionListener{
	
	private JPanel panelEingabe = new JPanel( );
	private JPanel panelButton = new JPanel( );
	private JPanel panelUeberschrift = new JPanel();
	
	private JLabel labelUeberschrift = new JLabel("Neuer Benutzer");
	private JLabel labelVorname = new JLabel( "Vorname" );
	private JLabel labelBenutzername = new JLabel( "Benutzername" );
	private JLabel labelPasswort = new JLabel( "Passwort" );
	private JLabel labelNachname = new JLabel( "Nachname" );
	
	private JTextField textfeldNachname = new JTextField( );
	private JTextField textfeldVorname = new JTextField( 15 );
	private JTextField textfeldBenutzername = new JTextField( );
	
	private JPasswordField textfeldPasswort = new JPasswordField( );
	
	
	private JButton buttonOk = new JButton( "OK" );
	private JButton buttonAbbrechen = new JButton( "abbrechen" );
	private JButton buttonReset = new JButton( "Reset" );
	
	private String vorname = null;
	private String nachname = null;
	private String benutzername = null;
	private String passwort = null;
	
	
	public NeuerMitarbeiterFenster(){
		
		bestandteileAnordnen();
		ereignissensorenAnmeldung();
		erstelleFenster();

	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();

		if (obj == buttonAbbrechen) {	
			dispose();
		}
		
		if(obj == buttonReset){
			loescheTextFelder();
		}
		
		if(obj == buttonOk){
			
			if(ueberpruefeEingabe()){
				
				if(mitarbeiterNichtVorhanden()){ 
						fuegeMitarbeiterEin();
						 einfügenEnde();
					}

				}else{
					System.out.println("Mitarbeiter schon vorhanden!");
				}
			
			} else{
				
				System.out.println("Eingabe Fehler!");
			}
		}
	
	private void erstelleFenster() {
		
		setTitle("Neuer Benutzer");		
		setLocation(80,60);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		pack();
		setVisible(true);
		setResizable(false);
	}

	public void bestandteileAnordnen(){
		
		GroupLayout dafLayout = new GroupLayout(getContentPane());
		getContentPane().setLayout(dafLayout);
		
		dafLayout.setAutoCreateGaps(true);
		dafLayout.setAutoCreateContainerGaps(true);
		
	
		dafLayout.setVerticalGroup(dafLayout.createSequentialGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButton)
		);
		
		dafLayout.setHorizontalGroup(dafLayout.createParallelGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButton)
		);		
		
		panelUeberschriftAnordnen();
		panelEingabeAnordnen();
		panelButtonAnordnen();
	}
	
	private void panelUeberschriftAnordnen(){
		panelUeberschrift.setLayout(new FlowLayout());
		panelUeberschrift.add(labelUeberschrift);
		labelUeberschrift.setFont(new Font("Times new Roman", Font.BOLD, 22));
	}
	
	public void panelEingabeAnordnen(){
		
		GroupLayout panelEingabeLayout = new GroupLayout(panelEingabe);
		panelEingabe.setLayout(panelEingabeLayout);
		
		panelEingabeLayout.setAutoCreateGaps(true);
		panelEingabeLayout.setAutoCreateContainerGaps(true);
		
		panelEingabeLayout.setVerticalGroup(panelEingabeLayout.createSequentialGroup( ).
					addGroup(panelEingabeLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelNachname ).
						addComponent( textfeldNachname )
					).
					addGroup(panelEingabeLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
					  	addComponent( labelVorname ).
						addComponent( textfeldVorname )
					).
					addGroup(panelEingabeLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						  	addComponent( labelBenutzername ).
							addComponent( textfeldBenutzername )
						).
			  		addGroup(panelEingabeLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
			  			addComponent( labelPasswort ).
			  			addComponent( textfeldPasswort )));
						
		panelEingabeLayout.setHorizontalGroup(panelEingabeLayout.createParallelGroup( ).addGroup(panelEingabeLayout.createSequentialGroup( ).
					addGroup( panelEingabeLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( labelNachname, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelVorname,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelBenutzername,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelPasswort, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE )
						).
					addGroup( panelEingabeLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( textfeldNachname, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldVorname,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldBenutzername,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldPasswort, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE )
						)));
			
	}
	
	public void panelButtonAnordnen(){
		
		panelButton.setLayout(new FlowLayout());
		panelButton.add(buttonOk);
		panelButton.add(buttonReset);
		panelButton.add(buttonAbbrechen);
		
	}
	
	public void ereignissensorenAnmeldung(){
		
		buttonOk.addActionListener(this);
		buttonReset.addActionListener(this);
		buttonAbbrechen.addActionListener(this);
	}
	
	private void fuegeMitarbeiterEin() {
		System.out.println("Mitarbeiter wird angelegt");
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Mitarbeiter mitarbeiter = new Mitarbeiter();
		
		mitarbeiter.setVorname(vorname);
		mitarbeiter.setNachname(nachname);
		mitarbeiter.setBenutzername(benutzername);
		mitarbeiter.setPasswort(passwort);
		
		em.persist(mitarbeiter);
		em.getTransaction().commit();
		em.close();
	}
	
	public void einfügenEnde(){
		
		Object[] options = {"Fertig!","Weitere Benutzer registrieren!"};
		int selected = JOptionPane.showOptionDialog(null,"Neuer Benutzer erfolgreich registriert!", "Registrierung Erfolgreich", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		case 0:
			dispose();
			break;
		case 1:
			loescheTextFelder();
			break;
		
		}
	}
	
	private void loescheTextFelder() {
		
		textfeldNachname.setText(null);
		textfeldVorname.setText(null);
		textfeldBenutzername.setText(null);
		textfeldPasswort.setText(null);
	}
	
	private boolean ueberpruefeEingabe() {
		
		boolean pruefe = false;
		try {
			pruefe = hohleEingabe();
		} catch (EingabeException e) {
			System.out.println("Eingabe Fehlt");
		}
		return pruefe;
		
	}
	
	private boolean hohleEingabe() throws EingabeException {
		
		vorname = textfeldVorname.getText();
		nachname = textfeldNachname.getText();
		benutzername = textfeldBenutzername.getText();
		passwort = String.valueOf(textfeldPasswort.getPassword());
		
		if(isEingabeLeer()){
			
			throw new EingabeException("Eine oder mehrere Eingaben fehlen.");
		
		}else if(enthaeltStringZahlen()){
			
			throw new EingabeException("Bitte für Vorname, Nachname und Benutzername keine Zahlen eingeben");
		}
			return true;
	}
	
	private boolean enthaeltStringZahlen() {
		
		/*
		 * Der jeweilige String wird nacheinander char für char durchlaufen
		 * ist ein char eine Zahl wird true zurückgegeben!
		 */
		
		for(int i = 0; i< vorname.length();i++){
			System.out.println(i);
			if(Character.isDigit(vorname.charAt(i))) { 
				return true;
			}
		}
		
		for(int i = 0; i< nachname.length();i++){
			System.out.println(i);
			if(Character.isDigit(nachname.charAt(i))) { 
				return true;
			}
		}
		
		for(int i = 0; i< benutzername.length();i++){
			System.out.println(i);
			if(Character.isDigit(benutzername.charAt(i))) { 
				return true;
			}
		}
           return false;
	}

	private boolean isEingabeLeer() {
		
		if(vorname.length() == 0 || nachname.length() == 0 || benutzername.length() == 0 || passwort.length() == 0){
		
			return true;
		
		}else{
		
			return false;
		}
	}
	
	
	private boolean mitarbeiterNichtVorhanden() {
		boolean isVorhanden = false;
		
		try {
			isVorhanden = ueberpruefeMitarbeiter();
			
		} catch (EingabeException e) {
			System.out.println("Mitarbeiter schon vorhanden Exception!");
		}

		return isVorhanden;

	}

	private boolean ueberpruefeMitarbeiter() throws EingabeException {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT m FROM Mitarbeiter m WHERE  m.benutzername = :name AND m.passwort =:passwort");
   	 			  q.setParameter("name", benutzername);
   	 			  q.setParameter("passwort", passwort);
   	 			  
   	 	if(q.getResultList().size() == 0){
   	   	 	em.close();   
   	   	    System.out.println("Benutzer noch nicht vorhanden.");
   	   	    return true;

   	 		   
   	 	 }else{
   	   	    em.close();
   	   	    throw new EingabeException("Benutzer mit eingegebenem Benutzernamen schon vorhanden!");
   	 	   
   	 	 }
	}
	
}